package main
import(
	"fmt"
)
type calc func(int,int)int
type Int  int
func add(a,b int)int{
	return a+b
}
func sub(a,b int)int{
	return a-b
}

func funcCalc(a,b int,c calc)int {
	return c(a,b)
}

func getFunc(operation string)func(int,int)int{
	switch operation{
	case "+":
		return add
	case "-":
		return sub
	case "*":
		return func(a,b int)int{return a*b}
	default:
		return nil
	}
}

func main(){
	var c calc
	c=add
	fmt.Printf("type=%T\n",c)
	ret:=c(10,20)
	fmt.Println(ret)
	ca:=sub
	fmt.Printf("type=%T\n",ca)

	var a Int=10
	var b int=20
	fmt.Printf("a的类型:%T b的类型:%T\n",a,b)
	fmt.Println(int(a)+b)//类型不同 需要转化为相同的内置类型才能进行 加法运算

	ret=funcCalc(10,20,add)
	fmt.Printf("ret=%d\n",ret)

	//匿名函数 和C++中的lambda表达式差不多
	ret=funcCalc(10,20,func(a,b int)int{
		return a*b
	})
	fmt.Printf("ret=%d\n",ret)

	//根据操作符号  获取不同的匿名函数
	func_cal:=getFunc("+")
	fmt.Println(func_cal(20,30))
	fmt.Println(getFunc("*")(30,30))

	//匿名自执行函数
	func(a,b int){fmt.Println(a,b)}(20,30)

	calc1:=func(a,b int)int{return a*b}
	fmt.Println(calc1(20,30))
}